package giochi;

public class GiocoDellaVita {

	private char[][] mappa, nuovaMappa;

	public GiocoDellaVita(int n, int m) {
		if (n <= 0 || m <= 0)
			throw new IllegalArgumentException();

		mappa = new char[n][m];
		nuovaMappa = new char[n][m];

		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				mappa[i][j] = '.';

	}// costruttore

	public void aggiungiOrganismo(int i, int j) {
		if (i < 0 || i > mappa.length || j < 0 || j > mappa.length)
			throw new IllegalArgumentException();

		mappa[i][j] = '*';
	}// aggiungi in cordinate

	public void aggiungiOrganismo() {
		int i = 0, j = 0;
		boolean inserito = false;
		do {
			i = (int) (Math.round(Math.random() * (mappa.length - 1)));
			j = (int) (Math.round(Math.random() * (mappa[0].length - 1)));

			if (mappa[i][j] == '.') {
				mappa[i][j] = '*';
				inserito = true;
			}
		} while (!inserito);

	}

	public void prossimaGenerazione() {
		for (int i = 0; i < mappa.length; i++)
			for (int j = 0; j < mappa[0].length; j++) {
				int cont = vicini(i, j);
				if (mappa[i][j] == '*') {
					if (cont == 0 || cont == 3)
						nuovaMappa[i][j] = '*';
					else
						nuovaMappa[i][j] = '.';
				} else if (cont == 3)
					nuovaMappa[i][j] = '*';
				else
					nuovaMappa[i][j] = '.';
			}

		char[][] temp = mappa; // scambio matrici
		mappa = nuovaMappa;
		nuovaMappa = temp;

	}// prossimaGenerazione

	private int vicini(int i, int j) {

		int cont = 0;

		if (i > 0 && mappa[i - 1][j] == '*')// nord
			cont++;
		if (i > 0 && j < mappa[i].length - 1 && mappa[i - 1][j + 1] == 'x')// nord
																			// est
			cont++;
		if (j < mappa[i].length - 1 && mappa[i][j + 1] == '*')// est
			cont++;
		if (i < mappa.length - 1 && j < mappa[i].length - 1
				&& mappa[i + 1][j + 1] == '*')// se
			cont++;
		if (i < mappa.length - 1 && mappa[i + 1][j] == '*')// sud
			cont++;
		if (i < mappa.length - 1 && j > 0 && mappa[i + 1][j - 1] == '*')// sud
																		// ovest
			cont++;
		if (j < 0 && mappa[i][j - 1] == '*')// ovest
			cont++;
		if (i > 0 && j > 0 && mappa[i - 1][j - 1] == '*')// nord ovest
			cont++;

		return cont;
	}// vicini

	public String toString() {

		String s = "";
		for (int i = 0; i < mappa.length; i++) {
			for (int j = 0; j < mappa[i].length; j++) {
				s = s + mappa[i][j];
			}
			s = s + '\n';
		}

		return s;

	}

	public static void main(String[] args) {

		GiocoDellaVita gol = new GiocoDellaVita(50, 50);

		for (int i = 0; i < 100 ; i++)
			gol.aggiungiOrganismo();
		System.out.println(gol);
		System.out.println();

		for (int i = 0; i < 100; i++) {
			gol.prossimaGenerazione();
			System.out.println(gol);
			System.out.println();
		}
		System.out.println("Bye.");

	}// main

}// Gioco della vita
